package net.ib.mtalk.test;

import java.util.ArrayList;
import java.util.List;

import net.ib.mtalk.R;
import android.app.Activity;
import android.content.Context;
import android.database.DataSetObserver;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class ListViewTestAdapter extends BaseAdapter {
	
	// 인플레이터 등록
    private LayoutInflater mInflater;
	// Layout 사용을 위한 변수 선언
    private List<String> items;
    /**
     * 좋지 않음.
     */
//    // Activity에서 작업을 처리하기 위한 문맥.
//    private Activity mContext;

    /**
     * LayoutInflate 및 아이템을 설정.
     * @param context
     */
    public ListViewTestAdapter(Context context) {
    	// LayoutInflate 가 매번 불리는것을 피하기 위하여 변수로 저장(캐쉬)
        mInflater = LayoutInflater.from(context);
        // Context 대신 Activity 인자로 전달된 경우에 사용.
//        mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        // 아이템을 초기화
        items = new ArrayList<String>();
    }

    /**
     * LayoutInflate 를 설정하고 뷰로 부터 받은 데이터를 아이템에 설정한다.
     * @param context
     * @param items 뷰로 부터 받은 데이터 (TYPE은 변경하여 사용)
     */
    public ListViewTestAdapter(Context context, List<String> items){
    	// LayoutInflate 가 매번 불리는것을 피하기 위하여 변수로 저장(캐쉬)
        mInflater = LayoutInflater.from(context);
        // Context 대신 Activity 인자로 전달된 경우에 사용.
//        mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        
        this.items = items;
    }
    
    /**
     * 좋지 않음.
     */
//    /**
//     * LayoutInflate 를 설정하고 뷰로 부터 받은 데이터를 아이템에 설정한다.
//     * + Activity 에서 작업을 내용을 변경하기 위하여 mContext에 문맥을 넣는다.
//     * @param context Activity 를 받는다.
//     * @param items 뷰로 부터 받은 데이터 (TYPE은 변경하여 사용)
//     */
//    public ListViewTestAdapter(Activity context, List<String> items){
//    	
//    	mContext = context;
//    	// LayoutInflate 가 매번 불리는것을 피하기 위하여 변수로 저장(캐쉬)
//        mInflater = LayoutInflater.from(context);
//        // Context 대신 Activity 인자로 전달된 경우에 사용.
////        mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//        
//        this.items = items;
//    }
    /**
     * 리스트안의 아이템수는 배열안의 speeches수에 의해 결정됨.
     * @see android.widget.ListAdapter#getCount()
     */
    public int getCount() {
        return items.size();
    }

    /**
     * 위치에 따른 데이터(객체타입)를 반환한다.
     * @see android.widget.ListAdapter#getItem(int)
     */
    public Object getItem(int position) {
        return position;
    }

    /**
     * 배열의 인덱스에 따른 위치(유일한 아이디)를 반환한다.
     * @see android.widget.ListAdapter#getItemId(int)
     */
    public long getItemId(int position) {
        return position;
    }

    /**
     * 각행에 대한 뷰를 만든다.
     *
     * @see android.widget.ListAdapter#getView(int, android.view.View,
     *      android.view.ViewGroup)
     */
    public View getView(int position, View convertView, ViewGroup parent) {
    	// 뷰에 사용할 아이템 구조체(?) 변수.
        ViewHolder holder;

        // convertView 가 "null"(처음로드) 이면 holder의 아이템에 XML 아이디를 연결하고 뷰를 그려준다.
        // 아니면 이미 아이디와 연결되어있으므로 바로 뷰를 그려준다.
        if (convertView == null) {
        	// R.layout."LAYOUT_XML" 을 리스트 아이템의 layout 이다.
//            convertView = mInflater.inflate(R.layout."LAYOUT_XML", null);
//            convertView = mInflater.inflate(R.layout."LAYOUT_XML", parent, false);

            // holder 객체 생성.
            holder = new ViewHolder();
            
            // "LAYOUT_XML" 의 아이디와 홀더 변수를 연결한다.
//            holder.text = (TextView) convertView.findViewById(R.id.text);
            
            // 뷰에 홀더를 설정한다.
            convertView.setTag(holder);
        } else {
            // 이미 존재하는 홀더에 바뀐 이미지를 적용한다.
            holder = (ViewHolder) convertView.getTag();
        }

        // 데이터를 설정한다.
        holder.text.setText(items.get(position));
        holder.icon.setImageResource(R.drawable.icon);


        /**
         * 좋지 않음.
         */
//        // Activity에서 데이터 변경을 위한 함수 (updateView 함수는 Activity에서 구현)
////        mContext.updateView(holder.icon, items.get(position));
//        
//        // Activity OnClick 에서 처리.
////        holder.text.setOnClickListener(mContext);

        return convertView;
    }

    // 각 행에 사용될 뷰를 위한 변수를 정의 한다.
    static class ViewHolder {
        TextView text;
        ImageView icon;
    }
    
    /**
     * 새로운 데이터 or 업데이트 된 데이터
     */
    @Override
    public void notifyDataSetChanged() {
    	// TODO Auto-generated method stub
    	super.notifyDataSetChanged();
    }
    
    /**
     * 사용가능 데이터가 더 없을때
     */
    @Override
    public void notifyDataSetInvalidated() {
    	// TODO Auto-generated method stub
    	super.notifyDataSetInvalidated();
    }
    
    /**
     * 주어진 위치에 대한 뷰의 타입
     */
    @Override
    public int getItemViewType(int position) {
    	// TODO Auto-generated method stub
    	return super.getItemViewType(position);
    }
    
    /**
     * 얼마나 많은 타입을 가지는지 확인
     */
    @Override
    public int getViewTypeCount() {
    	// TODO Auto-generated method stub
    	return super.getViewTypeCount();
    }

	@Override
	public boolean areAllItemsEnabled() {
		// TODO Auto-generated method stub
		return super.areAllItemsEnabled();
	}

	@Override
	public View getDropDownView(int position, View convertView, ViewGroup parent) {
		// TODO Auto-generated method stub
		return super.getDropDownView(position, convertView, parent);
	}

	@Override
	public boolean hasStableIds() {
		// TODO Auto-generated method stub
		return super.hasStableIds();
	}

	@Override
	public boolean isEmpty() {
		// TODO Auto-generated method stub
		return super.isEmpty();
	}

	@Override
	public boolean isEnabled(int position) {
		// TODO Auto-generated method stub
		return super.isEnabled(position);
	}

	@Override
	public void registerDataSetObserver(DataSetObserver observer) {
		// TODO Auto-generated method stub
		super.registerDataSetObserver(observer);
	}

	@Override
	public void unregisterDataSetObserver(DataSetObserver observer) {
		// TODO Auto-generated method stub
		super.unregisterDataSetObserver(observer);
	}
    
    
}
